iT邦幫忙

2023 iThome 鐵人賽

DAY 1
1

OVN 架構

OVN (Open Virtual Network) 包含二個主要的database, 一個是 North bound DB,另一個是South bound DB。

  • North bound DB: 儲存邏輯網路的資訊,被下列二個元件存取

    1. ovn-nbctl: 透過nbctl,可以建立的想要的邏輯網路架構,一般是指要建立幾個邏輯交換器、邏輯路由器,在交換器上要建立幾個port,邏輯交換器要和那一個邏輯路由器連接等資訊。
    2. ovn-northd: 邏輯網路架構寫入至North bound DB後,ovn-northd這個daemon會將North bound DB裡描述的邏輯網路架構,轉換成logical flow。
  • South bound DB: 儲存邏輯網路與實體網路對應的資訊,被下列二個元件存取

    1. ovn-northd: ovn-northd將轉換後的logical flow,寫入至South bound DB。
    2. ovn-controller: 將logical flow 轉換成OpenVSwitch (OVS)所使用的OpenFlow rule,OVS根據這些Rule做封包轉送。

整個來說,透過nbctl建立邏輯網路寫入North bound DB,ovn-northd將North bound DB轉換成logical flow寫入到South bound DB,
ovn-controller將South bound DB的logical flow轉換成OpenFlow rule寫入到OpneVSwitch.

在這張圖中,我使用的表示法與 OVN 官方文件上稍有不同。官網上是由 CMS(Cloud Manager System) 寫入 Northbound Database,但我使用的是 ovn-nbctl。然而,二者的概念是一樣的。在不同的 CMS(如 OpenStack),CMS 必須先將建立的 Network 模型轉換成 OVN 邏輯網路的描述,然後再將其寫入 Northbound Database。在這裡,因為我們目前還沒有說明 OVN 與像 OpenStack 這樣的 CMS 之間的關聯,所以我直接用 ovn-nbctl 取代了 CMS。

gh

我同時把操作OVN時,最常用的三個指令用綠色來表示,分別是ovn-nbctl、ovn-sbctl以及ovs-vsctl。ovn-nbctl剛剛已經介紹過了,主要是用來建立/查詢我們想使用的邏輯網路架構。而ovn-sbctl則是用來查詢South bound DB,也就是說,邏輯網路和實體網路的對路,可以透過ovn-sbctl來查詢。這二個指令,都是要在controller上執行,因為North/South bound DB都是在controlle阿。另一個較特殊的是ovs-vsctl這個指令,這個指令可以用來查詢每一個hypervisor上的bridge狀況,所以必需在每一個hypervisor執行。當然ovs-vsctl不單單只是用來查詢hypervisor的bridge狀態,還有其他的功能,我們以後都會提到,目前最重要的是知道這三個指令要在那個節點上執行就夠囉。

實驗環境

有了對 OVN 架構的基本認識後,我們需要一個包含 controller 與 hypervisor 兩種不同角色節點的測試環境,以驗證我們的理解。

在我們的測試環境中,第一個 controller 節點,除了擔任 controller 的角色外,還同時擔任 hypervisor 的角色;而第二個節點,就單純做為hypervisor使用。
在此特別提醒注意,不要讓防火牆封鎖 6441/TCP、6442/TCP 和 6081/UDP 這三個端口。其中, 6441/TCP 和 6442/TCP 是 Northbound Database 和 Southbound Database 使用的端口;而 6081/UDP 則是 dataplane 所使用的端口。如果這些端口被阻擋,邏輯網路就無法正常運作。

以下是可供在 Ubuntu 環境下自行安裝的指令:

Controller Setup

apt-get update
apt-get -y install build-essential fakeroot
apt-get -y install python-six openssl
apt-get -y install openvswitch-switch openvswitch-common 
# install on controller 
apt-get -y install ovn-central ovn-common ovn-host
export CONTROLLER_IP=<CONTROLLER_IP>

ovn-nbctl set-connection ptcp:6641:${CONTROLLER_IP} 
ovn-sbctl set-connection ptcp:6642:${CONTROLLER_IP} 
ovs-vsctl set open . external-ids:ovn-remote=tcp:${CONTROLLER_IP}:6642 
ovs-vsctl set open . external-ids:ovn-encap-type=geneve 
ovs-vsctl set open . external-ids:ovn-encap-ip=${CONTROLLER_IP}

Hypervisor Setup

apt-get update
apt-get -y install build-essential fakeroot
apt-get -y install python-six openssl 
apt-get -y install openvswitch-switch openvswitch-common 
# install on hypervisor 
apt-get -y install ovn-host ovn-common
export HYPERVISOR_IP=<HYPERVISOR_IP>
export CONTROLLER_IP=<CONTROLLER_IP> 

ovs-vsctl set open . external-ids:ovn-remote=tcp:${CONTROLLER_IP}:6642 
ovs-vsctl set open . external-ids:ovn-encap-type=geneve 
ovs-vsctl set open . external-ids:ovn-encap-ip=${HYPERVISOR_IP}

如果您認為上述步驟仍然太複雜,我也有整理一個 Vagrantfile,可以直接透過 Vagrant 啟動一個包含一個 controller 與一個 hypervisor 的兩個節點群集。

git clone https://github.com/ogre0403/iTHome-2023.git
cd iTHome-2023/day-01
vagrant up

最後我們完成的測試環境長得就像這個樣子。讓我們來觀查一下這個環境幾點該注意的地方吧。

gh

  1. 如果你是用vagrant建立的,這二個VM應該都會有三個NIC(eth0, eth1, eth2)。
    • eth0是vagrant建立的VM一定會有的NIC,作用做為對外連線的NAT。如果你的vagrant是透過VirtualBox建立VM,每個VM的eth0都會是10.0.2.15這一個IP。後續在討論OVN的NAT機制時,我們會使用到他。
    • 注意到eth2我們沒有給他設定IP,這張網卡我們在後續會用來做OVN的localnet實驗。
    • eth1與genev_sys_6081這二個網卡,是OVN使用做為GENEVE overlay network流量的網卡,至於什麼是GENEVE,什麼是overlay網路,在後面幾天馬上就會看到。
  2. br-int這個bridge,是OVN安裝完成後,建立的一個預設bridge。
  3. 每個hypervisor都有一個Chassis的ID (因為我們把controller也當成hypervisor使用,所以也有chassis ID), chassis id 可以用ovn-sbctl來查詢。
  4. 這張圖最難理解的就是二個節點的br-int上,各有一個ovn-xxxxxx-0的port。再仔細看一下,controller的br-int的port名稱為ovn-a17b40-0, 而hypervisor的chassis id也剛好為 a17b40;另一方面,hypervisor的br-int的port名稱為ovn-1cea77-0, 而controller的chassis id也剛好為 1cea77

剛才觀查的最後一點,hypervisor的chassis id和 br-int上的port名稱,這二者之間到底有什麼關連呢?
實際上,當OVN架構裡有N個hypervisor時,br-int上就會有N-1個port,每個port的名稱都對應至一個hypervisor的chassis id。封包要出去時,就直接依照目的地hypervisor, 由相對應的port送出。
例如,如果現在有一個controller上的虛擬機器VM1,要送封包給hypervisor上的虛擬機器VM2,VM1的封包的送出去的流向是 VM1 -> controller的br-int的ovn-a17b40-0 -> controller的genv_sys_6081 -> controller的eth1, 之後,這個封包就會直接送給hypervisor.

說到這裡,可能還不是非常俱體,後面我們會有更完整的實驗,讓大家更理解整個流程。

讓我們來驗證一下吧

讓我們分別在controller/hypervisor上,檢查目前有那些OVN的process正在執行吧。

首先,在controller上,可以看到有二個ovsdb-server,一個使用6641/TCP,一個使用6642/TCP。這二個分別是North bound DB與South bound DB。
還記得我們把controller也當成hypervisor來使用嗎? 所以可以看到有ovn-controller這個process,並且向controller:6642建立連結。
另外,也可以看到6081/UDP,而這個Port是OVN透過 GENEVE protocol建立的overlay網路,要跨節點通訊時所要用到的port。

vagrant ssh controller -c 'sudo netstat -alntpu' | grep -Ev ':22|:53|:68'
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 192.168.33.10:6641      0.0.0.0:*               LISTEN      10480/ovsdb-server
tcp        0      0 192.168.33.10:6642      0.0.0.0:*               LISTEN      10484/ovsdb-server
tcp        0      0 192.168.33.10:39744     192.168.33.10:6642      ESTABLISHED 9685/ovn-controller
tcp        0      0 192.168.33.10:6642      192.168.33.20:49676     ESTABLISHED 10484/ovsdb-server
tcp        0      0 192.168.33.10:6642      192.168.33.10:39744     ESTABLISHED 10484/ovsdb-server
udp        0      0 0.0.0.0:6081            0.0.0.0:*                           -
udp6       0      0 :::6081                 :::*                                -

再來,在hypervisor上,看到ovn-controller向controller:6642(就是South bound DB)建立連線,同時,6081/UDP也是正處於listen。

vagrant ssh hypervisor -c 'sudo netstat -alntpu' | grep -Ev ':22|:53|:68'
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 192.168.33.20:49676     192.168.33.10:6642      ESTABLISHED 9675/ovn-controller
udp        0      0 0.0.0.0:6081            0.0.0.0:*                           -
udp6       0      0 :::6081                 :::*                                -

今天我們學到了OVN的整體架構,以及OVN裡North bound DB、South bound DB等元件之間的關係,也安裝一個二個節點的OVN cluster,
並驗證了元件之間連線的關係。明天,我們將和大家介紹,如何透過ovn-nbctl建立邏輯網路。

Reference

  1. OVN - Basics and deep dive

下一篇
Day-02: 虛擬機器網路卡連至邏輯交換器
系列文
在OpenStack Neutron的ovn-networking裡挖呀挖呀挖30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言